PyTorch入门:为何张量至关重要
PyTorch 是一个高度灵活、动态的开源框架,广受深度学习研究和快速原型开发的青睐。其核心是 张量,它是不可或缺的数据结构。它是一种多维数组,专为高效处理深度学习模型所需的数值运算而设计,并支持自动的 GPU加速。
1. 理解张量结构
在 PyTorch 中,每一个输入、输出和模型参数都封装在张量中。它们的作用与 NumPy 数组相同,但针对专用硬件(如 GPU)进行了优化,使其在执行神经网络所需的大型线性代数运算时效率更高。
张量的关键属性包括:
- 形状:定义数据的维度,以元组形式表示(例如,一批图像的形状为 $4 \times 32 \times 32$)。
- 数据类型:指定存储元素的数值类型(例如,模型权重使用
torch.float32,索引操作使用torch.int64)。 - 设备:指示物理硬件位置,通常是
'cpu'或'cuda'(NVIDIA GPU)。
动态图与自动求导
PyTorch 使用命令式执行模型,意味着计算图是在操作执行过程中逐步构建的。这使得内置的自动微分引擎 Autograd 可以跟踪张量上的每一步操作,前提是设置了属性
requires_grad=True。这使得反向传播过程中梯度的计算变得非常简单。终端bash — pytorch-env
> 准备就绪。点击“运行”开始执行。
>
张量检查器实时
运行代码以检查活跃的张量
问题 1
哪个命令可以创建一个包含服从 0 到 1 之间均匀分布随机数的 $5 \times 5$ 张量?
问题 2
如果张量 $A$ 在 CPU 上,而张量 $B$ 在 CUDA 设备上,尝试计算 $A + B$ 会发生什么?
问题 3
深度学习中,模型权重和中间计算最常用的数据类型(dtype)是什么?
挑战:张量操作与形状
为特定矩阵运算准备张量。
你有一个形状为 $(10,)$ 的特征向量 $F$。你需要将其乘以一个形状为 $(10, 5)$ 的权重矩阵 $W$。为了使矩阵乘法(MatMul)成功,$F$ 必须是二维的。
步骤 1
在与 $W$ 相乘之前,$F$ 的形状应为何?
解答:
内部维度必须匹配,因此 $F$ 必须是 $(1, 10)$。然后 $(1, 10) @ (10, 5) \rightarrow (1, 5)$。
代码:
内部维度必须匹配,因此 $F$ 必须是 $(1, 10)$。然后 $(1, 10) @ (10, 5) \rightarrow (1, 5)$。
代码:
F_new = F.unsqueeze(0) 或 F_new = F.view(1, -1)步骤 2
对 $F_{new}$ 和 $W$(形状为 $(10, 5)$)执行矩阵乘法。
解答:
操作很简单,就是标准的矩阵乘法。
代码:
操作很简单,就是标准的矩阵乘法。
代码:
output = F_new @ W 或 output = torch.matmul(F_new, W)步骤 3
哪种方法能显式返回具有指定维度的张量,从而允许你将张量展平回 $(50,)$?(假设 $F$ 最初是 $(5, 10)$,现在已被展平。)
解答:
使用
代码:
使用
view 或 reshape 方法。最快展平方式通常是使用 -1 来表示一个维度。代码:
F_flat = F.view(-1) 或 F_flat = F.reshape(50)